package cn.fz.ssedemo.domain.vo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;

/**
 * 统一返回结果
 * @param <T>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Builder
@Schema(description = "统一返回结果")
public class ResultVO<T> {
    /**
     * 请求状态
     */
    // @Schema(description = "请求状态")
    // private Integer status;

    /**
     * 请求响应代码，如：0-成功，1-失败
     */
    @Schema(description = "请求响应代码")
    private String code;

    /**
     * 请求返回信息描述或异常信息
     */
    @Schema(description = "请求返回信息描述或异常信息")
    private String message;

    /**
     * 接口请求返回业务对象数据
     */
    @Schema(description = "接口请求返回业务对象数据")
    private T data;

    /**
     * 请求成功，对返回结果进行封装
     */
    public static <T> ResultVO<T> success() {
        return build(CodeEnum.SUCCESS.code, CodeEnum.SUCCESS.message, null);
    }

    /**
     * 请求成功，对返回结果进行封装
     */
    public static <T> ResultVO<T> success(T data) {
        return build(CodeEnum.SUCCESS.code, CodeEnum.SUCCESS.message, data);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> ResultVO<T> failed(String message) {
        return build(CodeEnum.FAIL.code, message, null);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> ResultVO<T> failed(String message,T data) {
        return build(CodeEnum.FAIL.code, message, data);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> ResultVO<T> failed(String message, String code) {
        return build(code, message, null);
    }

    /**
     * 返回结果统一封装
     */
    private static <T> ResultVO<T> build(String code, String message, T data) {
        ResultVO<T> vo = new ResultVO<>();
        // vo.setStatus(HttpStatus.OK.value());
        vo.setCode(code);
        vo.setMessage(message);
        vo.setData(data);
        return vo;
    }
}
